module Main where
import DB
import IO
import Char






--KOMUNIKACJA Z UZYTKOWNIKIEM---------------------------------------------------------------------------------------
main = do
	putStrLn "\nWitaj w programie!!!\n\nWybierz co chcesz zrobic:"
	putStrLn " a) Stworz nowy arkusz kalkulacyjny"
	putStrLn " b) Otworz istniejacy arkusz kalkulacyjny"
	putStrLn " q) Wyjdz z programu"
--	putStrLn "?:> "
	chose <- getLine
	submenu chose

submenu x
	| x=="a"	= createSpreadsheet
	| x=="b"	= openSpreadsheet
	| x/="q"	= do
				putStrLn "\nNieznana funkcja!!!\n"
				main
	| otherwise	= putStrLn "\nDziekuje, zapraszam ponownie!\n"

createSpreadsheet = do
		let tablica = newTable Empty 2 2
		putStrLn "\n"
		putStrLn (showTable tablica)
		putStrLn "--Utworzono now arkusz.\n"
		actions tablica

openSpreadsheet =	catch (do
				putStrLn "Podaj nazwe pliku do odczytu:"
				fname <- getLine
				handle <- openFile fname ReadMode
				contents <- hGetContents handle
				let tablica = getData contents
				putStrLn ("\n"++(showTable tablica)++"\n")
				putStrLn "--Plik odczytany.\n"
				hClose handle
				actions tablica
			) errorHandler 
			where
				errorHandler e = if isDoesNotExistError e	then do
											putStrLn "Nie ma takiego pliku.\n"
											main
										else do 
											putStrLn "Nie udalo sie wczytac pliku :(\n"
											main

actions tablica = do
		putStrLn "Co chcesz teraz zrobic:"
		putStrLn " a) Zapisz otwarty arkusz kalkulacyjny"
		putStrLn " b) Wyświetl zawartość otwartego arkusza"
		putStrLn " c) Wyswietl pelna zawartosc wybranej komorki"
		putStrLn " d) Modyfikuj zawartosc komorki"
		putStrLn " e) Dodaj pusty wiersz"
		putStrLn " f) Dodaj pusta kolumne"
		putStrLn " g) Usun wiersz"
		putStrLn " h) Usun kolumne"
		putStrLn " q) Powrot do glownego menu (wszystkie zmiany zostana utracone)"
		chose <- getLine
		submenu2 chose tablica

isAddress s = (isAlpha a) && (isInteger i)
		where
			a = head s
			i = tail s

submenu2 x tablica
	| x=="a"	= do
				saveToFile tablica
				actions tablica
	| x=="b"	= do
				putStrLn "\n"
				putStrLn (showEvaluatedTable tablica)
				putStrLn "\n"
				actions tablica
	| x=="c"	= do
				putStrLn "Podaj adres komorki do wyswietlenia:"
				cellAddr <- getLine
				if (isAddress cellAddr) 
				then do
					let
						col = findColNumber [(head cellAddr)]
						row = (read (tail cellAddr) :: Int) - 1
					if (( col >= (length (head tablica)) ) || (row >= (length tablica)) || row < 0)
					then 
						putStrLn "Nie mozna wyswietlic nieutworzonej komorki.\n"
					else
						putStrLn (showSingle tablica col row)
				else 
					putStrLn "Nieprawidlowy adres komorki.\n"
				actions tablica
	| x=="d"	= do
				putStrLn "Podaj adres komorki do modyfikacji:"
				cellAddr <- getLine
				if (isAddress cellAddr) 
				then do
					let
						col = findColNumber [(head cellAddr)]
						row = (read (tail cellAddr) :: Int) - 1
					if (( col >= (length (head tablica)) ) || (row >= (length tablica)) || row < 0)
					then do
						putStrLn "Nie mozna modyfikowac nieutworzonej komorki.\n"
						actions tablica
					else do
						putStrLn "Podaj nową wartość:"
						v <- getLine
						if (isNumeric v) 
						then do
							let 
								val = CellNumber (read v :: Float)
								w = setTableValue tablica val row col
							putStrLn "--Wprowadzono wartosc liczbowa.\n"
							actions w
						else do
							if ((head v) == '=') 
							then do
								let 
									val = CellFormula v 0.0
									--OBLICZANIE FORMULY TODO
									w = setTableValue tablica val row col
								putStrLn "--Wprowadzono formule.\n"
								actions w
							else do
								let 
									val = CellString v
									w = setTableValue tablica val row col
								putStrLn "--Wprowadzono tekst.\n"
								actions w
				else do
					putStrLn "Nieprawidlowy adres komorki.\n"
					actions tablica
	| x=="e"	= do
				putStrLn "Podaj pozycje nowego wiersza:"
				row <- getLine
				if (isInteger row)
				then do
					let r = (read row :: Int) - 1
					if (r>=0 && r<=(length tablica)) 
					then do
						let w = addRow tablica r
						putStrLn "--Wiersz zostal dodany.\n"
						actions w
					else do
						putStrLn "Nieprawidlowy numer wiersza.\n"
						actions tablica
				else do
					putStrLn "Nieprawidlowy numer wiersza.\n"
					actions tablica
	| x=="f"	= do
				putStrLn "Podaj pozycje nowej kolumny:"
				c <- getLine
				let k = findColNumber c
				if ( ((length c) == 1) && ( isAlpha (head c) ) && (( tablica /= [] && k <= (length (head tablica)) ) || k == 0 ))
				then do
					let w = addColumn tablica c
					putStrLn "--Dodano kolumne.\n"
					actions w
				else do
					putStrLn "Niepoprawna nazwa kolumny.\n"
					actions tablica
	| x=="g"	= do
				putStrLn "Podaj numer wiersza do usuniecia:"
				row <- getLine
				if (isInteger row)
				then do
					let r = (read row :: Int) - 1
					if (r>=0 && r<(length tablica)) 
					then do
						let w = delRow tablica r
						putStrLn "--Wiersz zostal usuniety.\n"
						actions w
					else do
						putStrLn "Nieprawidlowy numer wiersza.\n"
						actions tablica
				else do
					putStrLn "Nieprawidlowy numer wiersza.\n"
					actions tablica
	| x=="h"	= do
				putStrLn "Podaj pozycje usuwanej kolumny:"
				c <- getLine
				if ( ((length c)==1) && ( isAlpha(head c) ) && ( (findColNumber c)<(length(head tablica))) )
				then do
					let w = delColumn tablica c
					putStrLn "--Usunieto kolumne.\n"
					actions w
				else do
					putStrLn "Niepoprawna nazwa kolumny.\n"
					actions tablica
	| x/="q"	= do
				putStrLn "Nierozpoznana funkcja!!!\n"
				actions tablica
	|otherwise	= main

